package com.cmy.framework.room.dao

import android.util.Log
import androidx.room.*
import androidx.sqlite.db.SimpleSQLiteQuery
import androidx.sqlite.db.SupportSQLiteQuery
import java.lang.reflect.ParameterizedType

/**
 * @name:
 *  BaseDao
 * @package:
 *  com.cmy.framework.room
 * @date:
 *  2023/4/2517:35
 * @author
 *    cmy
 * @description
 *  基础数据类，实现对应的数据存储的dao
 */
abstract class BaseDao<T> :SqlQuery() {

    /**
     * 添加单个对象数据
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    abstract suspend fun insert(entity: T):Long

    /**
     * 添加数组对象数据
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    abstract suspend fun insert(vararg entity: T):LongArray?

    /**
     * 添加列表数据对象数据
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    abstract suspend fun insert(personList: MutableList<T>):LongArray?

    /**
     * 根据对象中的主键进行删除（主键是自动增长，无需手动赋值）
     */
    @Delete
    abstract suspend fun delete(entity : T)

    /**
     * 根据对象中的主键进行更新（主键是自动增长，无需手动赋值）
     */
    @Update
    abstract suspend fun update(entity:T)

    /**
     * 通过sql实现分页查询
     */
    @RawQuery
    abstract suspend fun doQueryByLimit(query: SupportSQLiteQuery):MutableList<T>?

    /**
     * 通过指定sql语句实现数据删除
     */
    @RawQuery
    abstract suspend fun doDeleteByParams(query: SupportSQLiteQuery): Int


    /**
     * 通过指定sql实现查询
     */
    @RawQuery
    abstract suspend fun doFind(query: SupportSQLiteQuery): T?

    /**
     * 查询所有数据
     */
    @RawQuery
    abstract suspend fun doFindAll(query: SupportSQLiteQuery): MutableList<T>?

    /**
     * 删除所有数据
     */
    @RawQuery
    abstract suspend fun doDeleteAll(query: SupportSQLiteQuery):Int

    /**
     * 删除表数据
     */
    suspend fun deleteAll():Int{
        val query = SimpleSQLiteQuery(sqlDeleteAll())
        return doDeleteAll(query)
    }

    /**
     * 查询表中所有数据
     */
    suspend fun findAll():MutableList<T>?{
        val query = SimpleSQLiteQuery(sqlSelectAll())
        return doFindAll(query)
    }

    /**
     * 通过主键查询对应的数据
     */
    suspend fun find(id:Long):T?{
        val query = SimpleSQLiteQuery("SELECT * FROM $tableName WHERE id = ?", arrayOf(id))
        return doFind(query)
    }

    /**
     * 通过对应条件删除数据
     * @param params
     *          表中对应的key
     * @param value
     *          表中对应key的值
     */
    suspend fun deleteByParams(params:String,value:String):Int{
        val query = SimpleSQLiteQuery("DELETE FROM $tableName WHERE $params = $value")
        return doDeleteByParams(query)
    }


    /**
     * 分页查询，支持传入多个字段，但必须要按照对应的顺序传入
     * key = value ，key = value的形式，，一一对应，（可以使用StringBuilder去构造）
     * @param strings
     *      分页查询条件数据
     * @param limit
     *      对应的页数
     * @param offset
     *      对应的偏移值
     */
    suspend fun doQueryByLimit(vararg strings:String,limit:Int = 0,offset:Int=0):MutableList<T>? {
        val query = SimpleSQLiteQuery("SELECT * FROM $tableName WHERE ${strings[0]} = ${strings[1]} limit $limit offset $offset")
        return doQueryByLimit(query)
    }


    /**
     * 降序分页查询
     * @param strings
     *      分页查询条件数据
     * @param limit
     *      对应的页数
     * @param offset
     *      对应的偏移值
     */
    suspend fun doQueryByOrder(vararg strings:String,limit:Int = 0,offset:Int=0):MutableList<T>?{
        val query = SimpleSQLiteQuery("SELECT * FROM $tableName ORDER BY ${strings[0]} DESC limit $limit offset $offset")
        return doQueryByLimit(query)
    }

}